/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Front.Vista.ObjetosComunes;

import Excepciones.NoConexionException;
import Front.Presentador.HiloStatusDescarga;
import Logica.Fabricas.Comando;
import ObjetoDominio.Archivo;
import Session.ArchivoLog;
import Session.Session;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *Clase dominio que posee las caracteristica de una descarga
 * @author guzmle
 */
public class Descarga extends Thread {
    
    private Comando _accionDescargar;
    private HiloStatusDescarga _accionMostrarProgreso;
    private Archivo _archivo;
    private boolean _terminado;

    public boolean isTerminado() {
        return _terminado;
    }

    public Archivo getArchivo() {
        return _archivo;
    }

    public void setArchivo(Archivo _archivo) {
        this._archivo = _archivo;
    }
    
    /**
     * Constructor de la clase que se indican los hilos requeridos para la
     * descarga
     * @param accionDescargar
     * @param accionMostrarProgreso 
     */
    public Descarga(Comando accionDescargar, HiloStatusDescarga accionMostrarProgreso, Archivo archivo){
        _accionDescargar = accionDescargar;
        _accionMostrarProgreso = accionMostrarProgreso;
        _archivo = archivo;
    }
    
    /**
     * Metodo que inicia todos los hilos que estan involucrado en una descarga
     */
    @Override
    public void run(){
        try {
            
            ArchivoLog.ObtenerArchivoLog().write(Session.getUsuarioConectador(), _archivo);
            _terminado = false;
            _accionDescargar.Ejecutar();
            _accionMostrarProgreso.start();
            while(_accionDescargar.esVivo()){
                if(_archivo.getDescargado()== _archivo.getTamaño()){     
                    ArchivoLog.ObtenerArchivoLog().write(Session.getUsuarioConectador(), _archivo);
                    _terminado=true;
                    break;
                }
            }
        
        } catch (NoConexionException ex) {
            Logger.getLogger(Descarga.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    /**
     * metodo que detiene todos los hilos que estan involucrado en una descarga
     */
    public void parar(){
        _accionDescargar.Detener();
        _accionMostrarProgreso.detener();
        _archivo.setDescargado(0);
        _archivo.setTamaño(0);
        if(!_archivo.isCargando()){
            File file = new File(_archivo.getRuta());
            file.delete();            
        }
        ArchivoLog.ObtenerArchivoLog().write(Session.getUsuarioConectador(), _archivo);
    }
    
    /**
     * metodo que pausa todos los hilos que estan involucrado en una descarga
     */
    public void pause(){
        if(_accionDescargar.esVivo()){
            _accionDescargar.Pausar();
            _accionMostrarProgreso.pause();
            _archivo.setPausado(true);
            ArchivoLog.ObtenerArchivoLog().write(Session.getUsuarioConectador(), _archivo);
    
        }
    }
    
    /**
     * metodo que reanuda todos los hilos que estan involucrado en una descarga
     */
    public void reanudar(){
        
        try {
            if(_accionDescargar.esVivo()){

            _accionDescargar.Reanudar();
            _accionMostrarProgreso.reanudar();
            }else{
                    _accionDescargar.Ejecutar();
                    _accionMostrarProgreso.start();
            }
            _archivo.setPausado(false);
        ArchivoLog.ObtenerArchivoLog().write(Session.getUsuarioConectador(), _archivo);
        } catch (NoConexionException ex) {
            Logger.getLogger(Descarga.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    
        
}
